package cn.iocoder.boot.springai001.config;

import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * Session 存储配置验证器
 * <p>
 * 在应用启动时验证配置是否正确
 * <p>
 * 这是 SessionStorageProperties 的一个实际使用示例
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class SessionStorageValidator {

    private final SessionStorageProperties properties;

    /**
     * 应用启动时执行配置验证
     */
    @PostConstruct
    public void validateConfiguration() {
        log.info("========================================");
        log.info("Session 存储配置验证");
        log.info("========================================");
        log.info("配置类型: {}", properties.getType());
        
        if (!properties.isValid()) {
            String errorMsg = String.format(
                "❌ 无效的 session.storage.type 配置: '%s'，只支持 'memory' 或 'database'",
                properties.getType()
            );
            log.error(errorMsg);
            throw new IllegalStateException(errorMsg);
        }

        if (properties.isMemoryStorage()) {
            log.info("✅ 使用内存存储模式 (适合开发环境)");
            log.warn("⚠️  生产环境建议使用 database 模式");
        } else if (properties.isDatabaseStorage()) {
            log.info("✅ 使用数据库存储模式 (适合生产环境)");
            log.info("📊 会话数据将持久化到数据库");
        }
        
        log.info("========================================");
    }

    /**
     * 获取当前存储类型的描述信息
     */
    public String getStorageTypeDescription() {
        if (properties.isMemoryStorage()) {
            return "内存存储 - 快速但重启后数据丢失";
        } else if (properties.isDatabaseStorage()) {
            return "数据库存储 - 持久化存储，支持多实例";
        }
        return "未知存储类型";
    }

    /**
     * 检查是否适合生产环境
     */
    public boolean isProductionReady() {
        return properties.isDatabaseStorage();
    }
}

